
# Nesta seção as bibliotecas necessárias para o funcionamento do código são importadas
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor
from IPython.display import display, Markdown, Latex
from sklearn.metrics import roc_auc_score
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, mean_absolute_error, mean_squared_error, r2_score
Resolução dos Exercícios¶
1. Considere o conjunto de dados disponível em aqui (dados crus aqui).¶
a. Observando o conjunto de dados (nome das colunas e tipos de dados), infira quais os possíveis objetivos de análise. Quais são as perguntas que poderiam ser respondidas com essa base de dados? Identifique as possíveis variáveis respostas e as variáveis explicativas.¶
cancer = pd.read_csv('./datasets/globalBreastCancerRisk.csv')
cancer.sample(10)
| country | continent | year | lifeExp | pop | gdpPercap | NewCasesOfBreastCancerIn2002 | AlcoholComsumption | BloodPressure | BodyMassIndex | Cholestorol | Smoking | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 88 | Paraguay | Americas | 2002 | 70.755 | 5884491 | 3783.674243 | 34.4 | 7.88 | 123.7607 | 25.36778 | 4.846562 | 14.8 |
| 86 | Pakistan | Asia | 2002 | 63.610 | 153403524 | 2092.712441 | 50.1 | 0.06 | 126.2059 | 23.07639 | 4.591925 | 6.6 |
| 66 | Libya | Africa | 2002 | 72.737 | 5368585 | 9534.677467 | 23.4 | 0.11 | 132.6075 | 28.51032 | 4.838883 | NaN |
| 49 | Hungary | Europe | 2002 | 72.590 | 10083313 | 14843.935560 | 63.0 | 16.27 | 129.7824 | 25.59566 | 5.189877 | 33.9 |
| 37 | Finland | Europe | 2002 | 78.370 | 5193039 | 28204.590570 | 84.7 | 12.52 | 128.6964 | 25.41902 | 5.436867 | 24.4 |
| 46 | Guinea-Bissau | Africa | 2002 | 45.504 | 1332459 | 575.704718 | 28.1 | 3.68 | 129.6245 | 22.44935 | 4.170127 | NaN |
| 113 | Tunisia | Africa | 2002 | 73.042 | 9770575 | 5722.895655 | 19.6 | 1.29 | 129.5677 | 27.26516 | 4.830195 | 1.9 |
| 98 | Singapore | Asia | 2002 | 78.770 | 4197776 | 36023.105400 | 48.7 | 1.55 | 123.2673 | 23.23321 | 4.835357 | NaN |
| 5 | Australia | Oceania | 2002 | 80.370 | 19546792 | 30687.754730 | 83.2 | 10.02 | 120.5113 | 26.25957 | 5.326858 | 21.8 |
| 61 | Kenya | Africa | 2002 | 50.992 | 31386842 | 1287.514732 | 25.2 | 4.14 | 127.8673 | 22.62218 | 4.405716 | 2.2 |
cancer.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 123 entries, 0 to 122 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 country 123 non-null object 1 continent 123 non-null object 2 year 123 non-null int64 3 lifeExp 123 non-null float64 4 pop 123 non-null int64 5 gdpPercap 123 non-null float64 6 NewCasesOfBreastCancerIn2002 123 non-null float64 7 AlcoholComsumption 123 non-null float64 8 BloodPressure 123 non-null float64 9 BodyMassIndex 123 non-null float64 10 Cholestorol 123 non-null float64 11 Smoking 93 non-null float64 dtypes: float64(8), int64(2), object(2) memory usage: 11.7+ KB
cancer.describe(include='number')
| year | lifeExp | pop | gdpPercap | NewCasesOfBreastCancerIn2002 | AlcoholComsumption | BloodPressure | BodyMassIndex | Cholestorol | Smoking | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 123.0 | 123.000000 | 1.230000e+02 | 123.000000 | 123.000000 | 123.000000 | 123.000000 | 123.000000 | 123.000000 | 93.000000 |
| mean | 2002.0 | 65.533455 | 4.553622e+07 | 10117.222157 | 37.935772 | 6.041138 | 126.778938 | 24.692500 | 4.780173 | 13.806452 |
| std | 0.0 | 12.358554 | 1.508646e+08 | 11467.906309 | 24.712584 | 4.421065 | 3.808400 | 2.329809 | 0.411901 | 11.889005 |
| min | 2002.0 | 39.193000 | 2.880300e+05 | 446.403513 | 3.900000 | 0.020000 | 117.656800 | 19.724140 | 4.089284 | 0.300000 |
| 25% | 2002.0 | 54.868000 | 4.447942e+06 | 1330.196332 | 19.500000 | 2.070000 | 123.862950 | 22.674800 | 4.393149 | 3.400000 |
| 50% | 2002.0 | 70.755000 | 1.059581e+07 | 5351.568666 | 28.100000 | 5.550000 | 126.467200 | 25.121810 | 4.824590 | 9.100000 |
| 75% | 2002.0 | 75.104500 | 3.122746e+07 | 12261.976500 | 50.600000 | 9.545000 | 129.744350 | 26.297125 | 5.102909 | 25.800000 |
| max | 2002.0 | 82.000000 | 1.280400e+09 | 44683.975250 | 101.100000 | 16.270000 | 134.237600 | 30.340410 | 5.658249 | 40.100000 |
cancer.describe(include='object')
| country | continent | |
|---|---|---|
| count | 123 | 123 |
| unique | 123 | 5 |
| top | Afghanistan | Africa |
| freq | 1 | 46 |
for c in cancer.select_dtypes('number').columns:
fig = px.box(cancer[c], height=600, width=800)
fig.show()
Resposta a:¶
O dataset aparentemente apresenta dados relacionados a mortes por cancer de mama em países de diferentes continentes, trazendo dados demográficos e características/habitos da população.
Alguns exemplos de pergutas são:
- Pessoas tem as mesmas chances de sobrevivência em todos os continentes?
- Pessoas com hipertensão arterial tem menos chances de sobreviver?
- Pessoas com sobrepeso tem menos chances de sobreviver?
- Pessoas com colesterol alto tem menos chances de sobreviver?
- Pessoas que fumam tem menos chances de sobreviver?
- Pessoas que usam álcool tem menos chances de sobreviver?
- Existe relação entre pib e mortalidade?
- Existe relação entre pib e novos casos?
As variáveis lifeExp e NewCasesOfBreastCancerIn2002 poderiam ser utilizadas como variáveis respostas, e todas as outras como explicativas, exceto o ano, que permanece sem variação e o nome do país, que é um identificador que não se repete.
b. Faça uma análise descritiva de acordo com o que foi discutido no item anterior;¶
Resposta b:¶
Parte da análise já foi feita na resposta a. Vejamos agora a relação entre algumas das variáveis;
# Primeiro, vamos comparar a variável de expectativa de vida com as outras, removendo as que não interessam.
# Para compará-las, faremos um gráfico de dispersão.
outras = ['continent', 'pop', 'gdpPercap', 'AlcoholComsumption', 'BloodPressure', 'BodyMassIndex', 'Cholestorol', 'Smoking']
for v in outras:
display(Markdown(f'## ANALISE DA VARIAVEL __{v.upper()}__'))
fig = px.scatter(cancer, y='lifeExp', x=v, hover_data='country', height=600, width=1024, title=f'Dispersão de {v} por lifeExp')
fig.show()
fig = px.scatter(cancer, y='NewCasesOfBreastCancerIn2002', x=v, hover_data='country' ,height=600, width=1024, title=f'Dispersão de {v} por NewCasesOfBreastCancerIn2002')
fig.show()
cancer.select_dtypes('number').corr()
| year | lifeExp | pop | gdpPercap | NewCasesOfBreastCancerIn2002 | AlcoholComsumption | BloodPressure | BodyMassIndex | Cholestorol | Smoking | |
|---|---|---|---|---|---|---|---|---|---|---|
| year | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| lifeExp | NaN | 1.000000 | 0.062449 | 0.681717 | 0.650152 | 0.313417 | -0.519339 | 0.541387 | 0.830656 | 0.588062 |
| pop | NaN | 0.062449 | 1.000000 | -0.055308 | -0.059314 | -0.038531 | -0.162692 | -0.160413 | -0.061245 | -0.145194 |
| gdpPercap | NaN | 0.681717 | -0.055308 | 1.000000 | 0.796440 | 0.482582 | -0.298199 | 0.395554 | 0.828968 | 0.638469 |
| NewCasesOfBreastCancerIn2002 | NaN | 0.650152 | -0.059314 | 0.796440 | 1.000000 | 0.593013 | -0.325525 | 0.338701 | 0.758112 | 0.717657 |
| AlcoholComsumption | NaN | 0.313417 | -0.038531 | 0.482582 | 0.593013 | 1.000000 | -0.017905 | 0.159407 | 0.476331 | 0.718278 |
| BloodPressure | NaN | -0.519339 | -0.162692 | -0.298199 | -0.325525 | -0.017905 | 1.000000 | -0.156743 | -0.370713 | -0.151423 |
| BodyMassIndex | NaN | 0.541387 | -0.160413 | 0.395554 | 0.338701 | 0.159407 | -0.156743 | 1.000000 | 0.620644 | 0.256736 |
| Cholestorol | NaN | 0.830656 | -0.061245 | 0.828968 | 0.758112 | 0.476331 | -0.370713 | 0.620644 | 1.000000 | 0.649361 |
| Smoking | NaN | 0.588062 | -0.145194 | 0.638469 | 0.717657 | 0.718278 | -0.151423 | 0.256736 | 0.649361 | 1.000000 |
px.imshow(cancer.select_dtypes('number').corr(), height=1000, zmin=-1, zmax=1)
c. Ajuste modelos que sejam adequados ao problema. Discuta os pressupostos da modelagem.¶
# Para este exercício, levaremos em consideração a variável Expectativa de Vida, logo, por ser um valor numérico contínuo, trata-se de um problema de REGRESSÃO.
# Nas análises gráficas, variáveis como GDP, colesterol e fumo têm correlação com a variável de expectativa de vida.
# Testaremos uma regressão linear:
lrm = LinearRegression()
interesse = outras + ['lifeExp']
cancer_ordenado = pd.get_dummies(cancer[interesse]).sort_values(by='lifeExp').dropna()
Xm = cancer_ordenado.drop('lifeExp', axis=1).values
ym = cancer_ordenado['lifeExp'].values
lrm.fit(Xm, ym)
print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)')
fig = px.line(height=600)
fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lrm.predict(Xm), mode='lines+markers', name='Regressão'))
fig.show()
Parametros da regressão: intercept: 2.2937667886588713, coef: [ 5.45717746e-09 4.52630506e-05 -5.60799494e-01 -5.01444111e-02 -1.96286947e-01 1.67042997e+01 5.70027167e-03 -8.14799678e+00 4.09052428e+00 -2.86889131e+00 3.56383455e+00 3.36252925e+00], formula: (intercept + coef * variável = resultado)
d. Verifique se o modelo proposto é adequado fazendo uma análise de resíduos.¶
for m in [mean_absolute_error, mean_squared_error, r2_score]:
resultado = m(ym, lrm.predict(Xm))
print(f'Métrica: {m}, Resultado: {resultado}')
Métrica: <function mean_absolute_error at 0x7fe0c83bbd00>, Resultado: 3.5980626731848973 Métrica: <function mean_squared_error at 0x7fe0c83e80d0>, Resultado: 24.750398273113124 Métrica: <function r2_score at 0x7fe0c83e85e0>, Resultado: 0.8014124519718855
e. Discuta como que os dados faltantes, NA (Not Avaliable) na coluna “Smoking”, podem¶
impactar na sua análise.
# Na minha análise, precisei me preocupar com os dados faltantes na hora de criar o modelo, já que a regressão linear não sabe lidar com valores ausentes.
2. Considere os dados disponíveis aqui sobre o salário anual (em mil USD) de uma amostra aleatória de 220 executivos (145 homens e 75 mulheres) (Foster, Stine e Waterman, 1998, pgs. 180-188).¶
O salário é relacionado com as seguintes variáveis explicativas: sexo (1: masculino; 0: feminino), posição na empresa (varia de 1 a 9, quanto maior o valor mais alta a posição) e anos de experiência no cargo.
- a. Faça uma análise descritiva.
- b. Faça uma modelagem que relaciona a variável resposta com as variáveis explicativas.
- c. Qual das duas variáveis dependentes que mais impactam no valor do salário?
- d. Discuta como que a relação entre as variáveis explicativas pode impactar na variável resposta.
- e. É possível afirmar que há uma desigualdade salarial entre sexos? E podemos concluir que uma pessoa ganha menos devido ao seu sexo?
a. Faça uma análise descritiva.¶
salarios = pd.read_csv('./datasets/salarios_fixed.txt', sep=';')
salarios.head(20)
| salario | genero | posicao | experiencia | |
|---|---|---|---|---|
| 0 | 148 | Masculino | 7 | 16.7 |
| 1 | 165 | Masculino | 7 | 6.7 |
| 2 | 145 | Masculino | 5 | 14.8 |
| 3 | 139 | Feminino | 7 | 13.9 |
| 4 | 142 | Feminino | 6 | 6.4 |
| 5 | 144 | Masculino | 5 | 9.1 |
| 6 | 128 | Feminino | 3 | 8.5 |
| 7 | 143 | Masculino | 6 | 18.2 |
| 8 | 157 | Masculino | 7 | 13.0 |
| 9 | 150 | Masculino | 7 | 21.6 |
| 10 | 115 | Masculino | 2 | 5.9 |
| 11 | 133 | Feminino | 3 | 9.1 |
| 12 | 128 | Masculino | 4 | 4.7 |
| 13 | 154 | Masculino | 6 | 11.5 |
| 14 | 121 | Feminino | 3 | 8.5 |
| 15 | 150 | Masculino | 8 | 22.4 |
| 16 | 133 | Masculino | 3 | 7.0 |
| 17 | 149 | Masculino | 5 | 12.2 |
| 18 | 145 | Masculino | 4 | 11.8 |
| 19 | 145 | Masculino | 7 | 12.0 |
# Informações básicas sobre os dados:
salarios.describe()
| salario | posicao | experiencia | |
|---|---|---|---|
| count | 220.000000 | 220.000000 | 220.000000 |
| mean | 142.868182 | 5.068182 | 10.478636 |
| std | 12.520518 | 1.787804 | 5.215060 |
| min | 110.000000 | 1.000000 | 1.700000 |
| 25% | 133.000000 | 4.000000 | 6.600000 |
| 50% | 143.500000 | 5.000000 | 9.500000 |
| 75% | 151.000000 | 6.000000 | 13.400000 |
| max | 172.000000 | 9.000000 | 26.100000 |
salarios.describe(include='object')
| genero | |
|---|---|
| count | 220 |
| unique | 2 |
| top | Masculino |
| freq | 145 |
salarios.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 220 entries, 0 to 219 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 salario 220 non-null int64 1 genero 220 non-null object 2 posicao 220 non-null int64 3 experiencia 220 non-null float64 dtypes: float64(1), int64(2), object(1) memory usage: 7.0+ KB
for c in salarios.select_dtypes('number').columns:
fig = px.box(salarios[c], height=600, width=800)
fig.show()
# Como o dataset está balanceado entre homens e mulheres?
salarios.value_counts('genero').plot(kind='bar', backend='plotly')
# Como o salário se comporta de acordo com o gênero?
fig = px.bar(salarios.sort_values(ascending=False, by='salario'), x='genero', y='salario', color='genero', height=600)
fig.show()
# O gráfico anterior mostra a soma dos salários dos homens e mulheres. Tem mais homens que mulheres no dataset. Teremos que analisar de outras formas.
# Como o salário se comporta de acordo com a posição?
fig = px.scatter(salarios.sort_values(ascending=False, by='salario'), x='posicao', y='salario', color='genero', height=600)
fig.show()
# Como o salário se comporta de acordo com a experiência?
fig = px.scatter(salarios.sort_values(ascending=False, by='salario'), x='experiencia', y='salario', color='genero', height=600)
fig.show()
# Qual o salário médio dos homens e das mulheres?
fig = px.line(height=600)
fig.add_trace(go.Scatter(y=salarios.query('genero == "Masculino"').salario, mode='lines+markers', name='Homens'))
fig.add_trace(go.Scatter(y=salarios.query('genero == "Feminino"').salario, mode='lines+markers', name='Mulheres'))
fig.show()
# Quais variáveis tem correlação com salário?
salarios_num = pd.get_dummies(salarios)
salarios_num.corr()
| salario | posicao | experiencia | genero_Feminino | genero_Masculino | |
|---|---|---|---|---|---|
| salario | 1.000000 | 0.819024 | 0.311747 | -0.138261 | 0.138261 |
| posicao | 0.819024 | 1.000000 | 0.569690 | -0.323168 | 0.323168 |
| experiencia | 0.311747 | 0.569690 | 1.000000 | -0.446360 | 0.446360 |
| genero_Feminino | -0.138261 | -0.323168 | -0.446360 | 1.000000 | -1.000000 |
| genero_Masculino | 0.138261 | 0.323168 | 0.446360 | -1.000000 | 1.000000 |
b. Faça uma modelagem que relaciona a variável resposta com as variáveis explicativas.¶
lrm = LinearRegression()
salarios_num_ordenado = pd.get_dummies(salarios.sort_values(by='salario'))
Xm = salarios_num_ordenado.drop('salario', axis=1).values
ym = salarios_num_ordenado['salario'].values
lrm.fit(Xm, ym)
print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)')
fig = px.line(height=600)
fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lrm.predict(Xm), mode='lines+markers', name='Regressão'))
fig.show()
Parametros da regressão: intercept: 114.16148210557286, coef: [ 6.71013498 -0.47251114 1.1006661 -1.1006661 ], formula: (intercept + coef * variável = resultado)
c. Qual das duas variáveis dependentes que mais impactam no valor do salário?¶
Posição e Genero.
d. Discuta como que a relação entre as variáveis explicativas pode impactar na variável resposta.¶
A tabela de correlações mostra que quem atinge os maiores salários é quem tem as posições mais altas. Um fator com alta correlação com a posição é a experiência. Por sua vez, o Gênero Masculino está mais correlacionado à experiência que o Feminino.
e. É possível afirmar que há uma desigualdade salarial entre sexos? E podemos concluir que uma pessoa ganha menos devido ao seu sexo?¶
Em minha análise não consegui dizer isso, dado que os dados estão bastante desbalanceados, e que o fator mais importante foi a posição ocupada.
3. Em um estudo para investigar a incidência de dengue numa determinada cidade da costa mexicana, um total de 196 indivíduos, escolhidos aleatoriamente em dois setores da cidade, respondeu às seguintes perguntas:¶
- I. idade: idade do entrevistado (em anos);
- II. nível: nível socioeconômico (nível=1, nível alto; nível=2, nível médio; nível=3, nível baixo);
- III. setor: setor da cidade onde mora o entrevistado (setor=1, setor 1; setor=2, setor 2)
- IV. caso: se o entrevistado contraiu (caso=1) ou não (caso=0) a doença recentemente.
Um dos objetivos do estudo é tentar prever ou explicar a probabilidade de um indivíduo contrair a doença dadas as variáveis explicativas. Os dados estão disponíveis aqui.
- a. Faça uma análise descritiva
- b. Faça uma modelagem adequada.
- c. De acordo com o seu modelo, qual é a probabilidade de uma pessoa de nível socioeconômico baixo, que possui 40 anos e que mora no setor 2 contrair dengue?
- d. De acordo com o seu modelo uma pessoa idosa de 70 anos possui maior chance de contrair dengue do que uma pessoa jovem de 20 anos? Quais seriam essas chances?
- e. Sua modelagem permite concluir que o fator socioeconômico influência na probabilidade da pessoa contrair dengue?
a. Faça uma análise descritiva¶
dengue = pd.read_csv('datasets/dengue_fixed.txt', names=['Idade', 'Nivel', 'Setor', 'Dengue'], sep=';')
dengue.head(20)
| Idade | Nivel | Setor | Dengue | |
|---|---|---|---|---|
| 0 | 33 | 1 | 1 | 0 |
| 1 | 35 | 1 | 1 | 0 |
| 2 | 6 | 1 | 1 | 0 |
| 3 | 60 | 1 | 1 | 0 |
| 4 | 18 | 3 | 1 | 1 |
| 5 | 26 | 3 | 1 | 0 |
| 6 | 6 | 3 | 1 | 0 |
| 7 | 31 | 2 | 1 | 1 |
| 8 | 26 | 2 | 1 | 1 |
| 9 | 37 | 2 | 1 | 0 |
| 10 | 23 | 1 | 1 | 0 |
| 11 | 23 | 1 | 1 | 0 |
| 12 | 27 | 1 | 1 | 0 |
| 13 | 9 | 1 | 1 | 1 |
| 14 | 37 | 1 | 2 | 1 |
| 15 | 22 | 1 | 2 | 1 |
| 16 | 67 | 1 | 2 | 1 |
| 17 | 8 | 1 | 2 | 0 |
| 18 | 6 | 1 | 2 | 1 |
| 19 | 15 | 1 | 2 | 1 |
dengue.describe()
| Idade | Nivel | Setor | Dengue | |
|---|---|---|---|---|
| count | 196.000000 | 196.000000 | 196.000000 | 196.000000 |
| mean | 25.178571 | 1.964286 | 1.403061 | 0.290816 |
| std | 18.904721 | 0.867505 | 0.491769 | 0.455302 |
| min | 1.000000 | 1.000000 | 1.000000 | 0.000000 |
| 25% | 10.750000 | 1.000000 | 1.000000 | 0.000000 |
| 50% | 21.000000 | 2.000000 | 1.000000 | 0.000000 |
| 75% | 35.000000 | 3.000000 | 2.000000 | 1.000000 |
| max | 85.000000 | 3.000000 | 2.000000 | 1.000000 |
dengue.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 196 entries, 0 to 195 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Idade 196 non-null int64 1 Nivel 196 non-null int64 2 Setor 196 non-null int64 3 Dengue 196 non-null int64 dtypes: int64(4) memory usage: 6.2 KB
px.box(dengue['Idade'], height=600)
# Neste momento, vejamos as correlações antes de alterarmos os tipos dos dados para categorias mais fáceis de ler:
dengue.corr()
| Idade | Nivel | Setor | Dengue | |
|---|---|---|---|---|
| Idade | 1.000000 | -0.092167 | 0.109160 | 0.251914 |
| Nivel | -0.092167 | 1.000000 | -0.230541 | -0.038487 |
| Setor | 0.109160 | -0.230541 | 1.000000 | 0.275428 |
| Dengue | 0.251914 | -0.038487 | 0.275428 | 1.000000 |
dengue['Nivel'] = dengue['Nivel'].replace({1: 'alto', 2: 'medio', 3: 'baixo'})
dengue['Setor'] = dengue['Setor'].replace({1: 'setor_1', 2: 'setor_2'})
dengue['Dengue'] = dengue['Dengue'].replace({1: True, 0: False})
dengue.head(20)
| Idade | Nivel | Setor | Dengue | |
|---|---|---|---|---|
| 0 | 33 | alto | setor_1 | False |
| 1 | 35 | alto | setor_1 | False |
| 2 | 6 | alto | setor_1 | False |
| 3 | 60 | alto | setor_1 | False |
| 4 | 18 | baixo | setor_1 | True |
| 5 | 26 | baixo | setor_1 | False |
| 6 | 6 | baixo | setor_1 | False |
| 7 | 31 | medio | setor_1 | True |
| 8 | 26 | medio | setor_1 | True |
| 9 | 37 | medio | setor_1 | False |
| 10 | 23 | alto | setor_1 | False |
| 11 | 23 | alto | setor_1 | False |
| 12 | 27 | alto | setor_1 | False |
| 13 | 9 | alto | setor_1 | True |
| 14 | 37 | alto | setor_2 | True |
| 15 | 22 | alto | setor_2 | True |
| 16 | 67 | alto | setor_2 | True |
| 17 | 8 | alto | setor_2 | False |
| 18 | 6 | alto | setor_2 | True |
| 19 | 15 | alto | setor_2 | True |
b. Faça uma modelagem adequada.¶
# O problema é de classificação, com variáveis categóricas em sua maioria, tanto alvo quanto preditoras.
dengue_num = pd.get_dummies(dengue)
dengue_num.corr()
| Idade | Dengue | Nivel_alto | Nivel_baixo | Nivel_medio | Setor_setor_1 | Setor_setor_2 | |
|---|---|---|---|---|---|---|---|
| Idade | 1.000000 | 0.251914 | 0.110942 | -0.053363 | -0.066079 | -0.109160 | 0.109160 |
| Dengue | 0.251914 | 1.000000 | 0.036970 | -0.031820 | -0.006486 | -0.275428 | 0.275428 |
| Nivel_alto | 0.110942 | 0.036970 | 1.000000 | -0.599564 | -0.464420 | -0.169620 | 0.169620 |
| Nivel_baixo | -0.053363 | -0.031820 | -0.599564 | 1.000000 | -0.430331 | 0.243437 | -0.243437 |
| Nivel_medio | -0.066079 | -0.006486 | -0.464420 | -0.430331 | 1.000000 | -0.078069 | 0.078069 |
| Setor_setor_1 | -0.109160 | -0.275428 | -0.169620 | 0.243437 | -0.078069 | 1.000000 | -1.000000 |
| Setor_setor_2 | 0.109160 | 0.275428 | 0.169620 | -0.243437 | 0.078069 | -1.000000 | 1.000000 |
lgrm = LogisticRegression()
dengue_ordenado = dengue_num.sort_values(by='Dengue')
Xm = dengue_ordenado.drop('Dengue', axis=1).values
ym = dengue_ordenado['Dengue'].values
lgrm.fit(Xm, ym)
print(f'Parametros da regressão: intercept: {lrm.intercept_}, coef: {lrm.coef_}, formula: (intercept + coef * variável = resultado)')
fig = px.line(height=600)
fig.add_trace(go.Scatter(y=ym, mode='lines+markers', name='Valores Reais'))
fig.add_trace(go.Scatter(y=lgrm.predict(Xm), mode='lines+markers', name='Regressão'))
fig.show()
Parametros da regressão: intercept: 114.16148210557286, coef: [ 6.71013498 -0.47251114 1.1006661 -1.1006661 ], formula: (intercept + coef * variável = resultado)
y_score = lgrm.predict_proba(Xm)[:, 1]
roc_auc_score(ym, y_score)
0.7273759939416887
cm = confusion_matrix(ym, lgrm.predict(Xm), labels=lgrm.classes_)
fig, ax = plt.subplots(figsize=(12,12))
ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=lgrm.classes_).plot(ax=ax)
plt.show()
c. De acordo com o seu modelo, qual é a probabilidade de uma pessoa de nível socioeconômico baixo, que possui 40 anos e que mora no setor 2 contrair dengue?¶
lgrm.predict([[40, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[40, 0, 1, 0, 0, 1]])
(array([ True]), array([[0.44534214, 0.55465786]]))
# é positiva, de 55%
d. De acordo com o seu modelo uma pessoa idosa de 70 anos possui maior chance de contrair dengue do que uma pessoa jovem de 20 anos? Quais seriam essas chances?¶
# Considerando o mesmo cenário anterior e variando apenas as idades:
lgrm.predict([[70, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[70, 0, 1, 0, 0, 1]])
(array([ True]), array([[0.26348661, 0.73651339]]))
lgrm.predict([[20, 0, 1, 0, 0, 1]]), lgrm.predict_proba([[20, 0, 1, 0, 0, 1]])
(array([False]), array([[0.57918668, 0.42081332]]))
# A pessoa de 70 anos teria 73% de chances de ter dengue, enquanto a pessoa de 20 anos teria 42% de chances.
e. Sua modelagem permite concluir que o fator socioeconômico influência na probabilidade da pessoa contrair dengue?¶
Muito pouco, quando comparado ao setor e idade.